import asyncio
from .通用 import UDP服务器信息, 读取参数
from .UDP服务器 import start_server
from .UDP消息 import UDP消息
from .UDP会话 import UDP会话


async def handler(会话: UDP会话):
    reader, writer = await asyncio.open_connection(UDP服务器信息.服务器地址, UDP服务器信息.服务器端口)

    async def 读取任务():
        while not writer.is_closing() and not 会话.会话关闭:
            data = await reader.read(1200)
            if not data:
                writer.close()
                会话.关闭()
            try:
                await 会话.发送数据(data)
            except:
                return

    async def 写回任务():
        while not writer.is_closing() and not 会话.会话关闭:
            try:
                消息: UDP消息 = await 会话.读一条消息()
                writer.write(消息.内容)
            except:
                writer.close()
                return

    await asyncio.gather(读取任务(), 写回任务())


async def 启动隧道UDP服务器():
    udp服务器 = await start_server(handler, UDP服务器信息.监听地址, UDP服务器信息.监听端口)
    if udp服务器 is None:
        return
    await udp服务器.serve_forever()


def main():
    读取参数()
    asyncio.run(启动隧道UDP服务器())
